package com.naiterui.ehp.bs.recommend.dao.mongo;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;

import com.naiterui.ehp.bs.recommend.bean.mongo.PatientRebuyNotice;
import com.naiterui.ehp.bs.recommend.util.Constants;

/**
 * 复购提醒数据访问层
 *
 * @since 2.19
 */
@Repository
public class RebuyNoticeDao extends MongoBaseDao {

    @Autowired
    private MongoTemplate mongoTemplate;

    private static final String COLLECTIOIN_NAME_REBUY_NOTICE = "patient_rebuy_notice";

    /**
     * 添加复购提醒记录
     * RebuyNoticeDao.saveRebuyNotice()
     *
     * @param patientRebuyNotice
     *
     * @Date 2018年6月27日
     * @since 2.19
     */
    public void saveRebuyNotice(PatientRebuyNotice patientRebuyNotice) {
        super.save(patientRebuyNotice, COLLECTIOIN_NAME_REBUY_NOTICE);
    }

    /**
     * 删除发送提醒记录
     * RebuyNoticeDao.removeRebuyNotice()
     *
     * @param id
     *
     * @Date 2018年6月27日
     * @since 2.19
     */
    public void removeUnSendRebuyNotice(Long patientId) {
        this.removeUnSendNoticeWithTime(patientId, null, null);
    }

    /**
     * 删除指定时间内未发送的复购消息
     * RebuyNoticeDao.removeUnSendNoticeWithinTime()
     *
     * @param patientId
     * @param startTime
     * @param endTime
     *
     * @Date 2018年6月29日
     * @since 2.19
     */
    public void removeUnSendNoticeWithTime(Long patientId, String startTime, String endTime) {
        Criteria criteria = Criteria.where("patientId").is(patientId).and("status").is(Constants.REBUY_NOTICE_STATUS_UNSEND);
        if (StringUtils.isNotEmpty(startTime) && StringUtils.isEmpty(endTime)) {
            criteria.and("noticeTime").gte(startTime);
        } else if (StringUtils.isEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
            criteria.and("noticeTime").lte(endTime);
        } else if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
            criteria.andOperator(Criteria.where("noticeTime").gte(startTime), Criteria.where("noticeTime").lte(endTime));
        }
        Query query = new Query();
        query.addCriteria(criteria);

        super.remove(query, COLLECTIOIN_NAME_REBUY_NOTICE);
    }

    public void removeUnSendNoticeWithOrderId(Long baseOrderId) {
        Criteria criteria = Criteria.where("baseOrderId").is(baseOrderId).and("status").is(Constants.REBUY_NOTICE_STATUS_UNSEND);
        Query query = new Query();
        query.addCriteria(criteria);
        super.remove(query, COLLECTIOIN_NAME_REBUY_NOTICE);
    }

    @Override
    protected MongoTemplate getMongoTemplate() {
        return this.mongoTemplate;
    }

}
